/*
 * @Author: Seon.Hu SeonHu@126.com
 * @Date: 2024-01-18 19:18:14
 * @LastEditors: Seon.Hu SeonHu@126.com
 * @LastEditTime: 2024-04-05 19:04:27
 * @FilePath: \bg-vben\src\components\AdChooseList\src\types.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

import { AdColumn } from '@/components/AdVxeTable';
import { FetchSetting } from '@/components/Table';
import { PageRequest, PageData, FilterGroup } from '@/utils/common/types';
import { FilterOperateEnum } from '@/enums/filterOperateEnum';

/** 尺寸类型 */
export type SizeType = 'default' | 'middle' | 'small' | 'large' | undefined;
// export type SizeType = null | '' | 'medium' | 'small' | 'mini';

/** 对话框选项 */
export interface DialogProps {
  /** 对话框标识 */
  id?: string;
  /** 宽度 */
  width?: string | number;
  /** 高度 */
  height?: string | number;
  /** 标题 */
  title?: string;
  /** 表格尺寸 */
  tableSize?: SizeType;
  /** 数据 */
  data?: Recordable[];
  /** 数据请求接口 */
  api?: (params: PageRequest) => Promise<PageData>;
  /** 额外的请求参数 */
  searchInfo?: FilterGroup;
  /** 查询条件请求之前处理 */
  searchInfoFn?: (info: FilterGroup) => Promise<FilterGroup>;
  /** 请求之前处理参数 */
  beforeFetch?: Fn;
  /** 请求之后处理返回参数 */
  afterFetch?: Fn;
  /** 请求配置 */
  fetchSetting?: Partial<FetchSetting>;
  /** 表格列配置 */
  columns: AdColumn[];
  /** 是否多选 */
  multiple?: boolean | (() => boolean);
  /** 选择函数，当返回值为 false 时阻止弹出关闭。 */
  selectFn?: (data: Recordable[]) => Promise<boolean | undefined | void>;
}

/** 高级选择列表选项 */
export interface AdChooseListProps {
  /** 绑定字段 */
  field?: string;
  /** 绑定的值 */
  value?: string;
  /** 筛选字段-默认绑定字段 */
  filterField?: string;
  /** 筛选操作 */
  filterOperate?: FilterOperateEnum;
  /** 是否验证数据 */
  validate?: boolean;
  /** 数据 */
  data?: Recordable[];
  /** 数据请求接口，如果定义了优先使用。 */
  api?: (params: PageRequest) => Promise<PageData>;
  /** 额外的请求参数 */
  searchInfo?: FilterGroup;
  /** 查询条件请求之前处理 */
  searchInfoFn?: (info: FilterGroup) => Promise<FilterGroup>;
  /** 请求之前处理参数 */
  beforeFetch?: Fn;
  /** 请求之后处理返回参数 */
  afterFetch?: Fn;
  /** 请求配置 */
  fetchSetting?: Partial<FetchSetting>;
  /** 表格列配置 */
  columns: AdColumn[];
  /** 值更改函数 */
  changeFn?: (data: Recordable) => Promise<void>;
  /** 选择函数，当返回值为 false 时阻止弹出关闭。 */
  selectFn?: (data: Recordable[]) => Promise<boolean | undefined | void>;

  /** 输入框尺寸 */
  size?: SizeType;
  /** 输入框占位符 */
  placeholder?: string;
  /** 是否禁用 */
  disabled?: boolean;

  /** 下拉面板-尺寸 */
  dropdownSize?: SizeType;
  /** 下拉面板-表格尺寸 */
  dropdownTableSize?: SizeType;
  /** 下拉面板-宽度 */
  dropdownWidth?: number;
  /** 下拉面板-高度 */
  dropdownHeight?: number;
  /** 下拉面板-是否禁用 */
  dropdownDisabled?: boolean;
  /** 下拉面板-固定显示下拉面板的方向 */
  dropdownPlacement?: 'top' | 'bottom';
  /** 下拉面板-在下拉容器关闭时销毁内容 */
  dropdownDestroyOnClose?: boolean;
  /** 下拉面板-是否将弹框容器插入于 body 内（对于嵌入到表格或者弹窗中被遮挡时需要设置为 true） */
  dropdownTransfer?: boolean;

  /** 对话框-标识 */
  dialogId?: string;
  /** 对话框-宽度 */
  dialogWidth?: string | number;
  /** 对话框-高度 */
  dialogHeight?: string | number;
  /** 对话框-标题 */
  dialogTitle?: string;
  /** 对话框-表格尺寸 */
  dialogTableSize?: SizeType;
  /** 对话框-是否多选 */
  dialogMultiple?: boolean | (() => boolean);
}

/** 转换 vxe-table 控件尺寸 */
export function castToVxeSize(size: SizeType): '' | 'medium' | 'small' | 'mini' | null | undefined {
  // null | '' | 'medium' | 'small' | 'mini'
  switch (size) {
    case 'default':
      return '';
    case 'small':
      return 'mini';
    case 'middle':
      return 'small';
    case 'large':
      return 'medium';
  }
  return undefined;
}
